package com.ly.generator.util;

import java.util.Arrays;

import com.ly.common.constant.GenConstants;
import com.ly.common.utils.StringUtils;
import com.ly.generator.config.GenConfig;
import com.ly.generator.domain.GenTable;
import com.ly.generator.domain.GenTableColumn;
import org.apache.commons.lang3.RegExUtils;

/**
 * 代码生成器 工具类
 * @author ruoyi
 */
public class GenUtils {
    /**
     * 初始化表信息
     */
    public static void initTable (GenTable genTable, String operName) {
        genTable.setClassName ( convertClassName ( genTable.getTableName () ) );
        genTable.setPackageName ( GenConfig.getPackageName () );
        genTable.setModuleName ( getModuleName ( GenConfig.getPackageName () ) );
        genTable.setBusinessName ( getBusinessName ( genTable.getTableName () ) );
        genTable.setFunctionName ( replaceText ( genTable.getTableComment () ) );
        genTable.setFunctionAuthor ( GenConfig.getAuthor () );
        genTable.setCreateBy ( operName );
    }

    /**
     * 初始化列属性字段
     */
    public static void initColumnField (GenTableColumn column, GenTable table) {
        String dataType = getDbType ( column.getColumnType () );
        String columnName = column.getColumnName ();
        column.setTableId ( table.getTableId () );
        column.setCreateBy ( table.getCreateBy () );
        // 设置java字段名
        column.setJavaField ( StringUtils.toCamelCase ( columnName ) );

        if ( arraysContains ( GenConstants.COLUMNTYPE_STR, dataType ) ) {
            column.setJavaType ( GenConstants.TYPE_STRING );
            // 字符串长度超过500设置为文本域
            Integer columnLength = getColumnLength ( column.getColumnType () );
            String htmlType = columnLength >= 500 ? GenConstants.HTML_TEXTAREA : GenConstants.HTML_INPUT;
            column.setHtmlType ( htmlType );
        } else if ( arraysContains ( GenConstants.COLUMNTYPE_TIME, dataType ) ) {
            column.setJavaType ( GenConstants.TYPE_DATE );
            column.setHtmlType ( GenConstants.HTML_DATETIME );
        } else if ( arraysContains ( GenConstants.COLUMNTYPE_NUMBER, dataType ) ) {
            column.setHtmlType ( GenConstants.HTML_INPUT );

            // 如果是浮点型 统一用BigDecimal
            String[] str = StringUtils.split ( StringUtils.substringBetween ( column.getColumnType (), "(", ")" ), "," );
            if ( str != null && str.length == 2 && Integer.parseInt ( str[1] ) > 0 ) {
                column.setJavaType ( GenConstants.TYPE_BIGDECIMAL );
            }
            // 如果是整形
            else if ( str != null && str.length == 1 && Integer.parseInt ( str[0] ) <= 10 ) {
                column.setJavaType ( GenConstants.TYPE_INTEGER );
            }
            // 长整形
            else {
                column.setJavaType ( GenConstants.TYPE_LONG );
            }
        }

        // 插入字段（默认所有字段都需要插入）
        column.setIsInsert ( GenConstants.REQUIRE );

        // 编辑字段
        if ( ! arraysContains ( GenConstants.COLUMNNAME_NOT_EDIT, columnName ) && ! column.isPk () ) {
            column.setIsEdit ( GenConstants.REQUIRE );
        }
        // 列表字段
        if ( ! arraysContains ( GenConstants.COLUMNNAME_NOT_LIST, columnName ) && ! column.isPk () ) {
            column.setIsList ( GenConstants.REQUIRE );
        }
        // 查询字段
        if ( ! arraysContains ( GenConstants.COLUMNNAME_NOT_QUERY, columnName ) && ! column.isPk () ) {
            column.setIsQuery ( GenConstants.REQUIRE );
        }

        // 查询字段类型
        if ( StringUtils.endsWithIgnoreCase ( columnName, "name" ) ) {
            column.setQueryType ( GenConstants.QUERY_LIKE );
        }
        // 状态字段设置单选框
        if ( StringUtils.endsWithIgnoreCase ( columnName, "status" ) ) {
            column.setHtmlType ( GenConstants.HTML_RADIO );
        }
        // 类型&性别字段设置下拉框
        else if ( StringUtils.endsWithIgnoreCase ( columnName, "type" )
                || StringUtils.endsWithIgnoreCase ( columnName, "sex" ) ) {
            column.setHtmlType ( GenConstants.HTML_SELECT );
        }
        // 内容字段设置富文本控件
        else if ( StringUtils.endsWithIgnoreCase ( columnName, "content" ) ) {
            column.setHtmlType ( GenConstants.HTML_EDITOR );
        }
    }

    /**
     * 校验数组是否包含指定值
     * @param arr         数组
     * @param targetValue 值
     * @return 是否包含
     */
    public static boolean arraysContains (String[] arr, String targetValue) {
        return Arrays.asList ( arr ).contains ( targetValue );
    }

    /**
     * 获取模块名
     * @param packageName 包名
     * @return 模块名
     */
    public static String getModuleName (String packageName) {
        int lastIndex = packageName.lastIndexOf ( "." );
        int nameLength = packageName.length ();
        String moduleName = StringUtils.substring ( packageName, lastIndex + 1, nameLength );
        return moduleName;
    }

    /**
     * 获取业务名
     * @param tableName 表名
     * @return 业务名
     */
    public static String getBusinessName (String tableName) {
        int lastIndex = tableName.lastIndexOf ( "_" );
        int nameLength = tableName.length ();
        String businessName = StringUtils.substring ( tableName, lastIndex + 1, nameLength );
        return businessName;
    }

    /**
     * 表名转换成Java类名
     * @param tableName 表名称 erp_area_info->AreaEntity
     * @return 类名
     */
    public static String convertClassName (String tableName) {
        boolean autoRemovePre = GenConfig.getAutoRemovePre ();
        String tablePrefix = GenConfig.getTablePrefix ();
        String tableSuffix = GenConfig.getTableSuffix ();
        if ( autoRemovePre && StringUtils.isNotEmpty ( tablePrefix ) ) {
            String[] searchList = StringUtils.split ( tablePrefix, "," );
            tableName = replaceFirst ( tableName, searchList );//area_info：经过该方法去掉前缀
        }
        if ( autoRemovePre && StringUtils.isNotEmpty ( tableSuffix ) ) {
            String[] searchList = StringUtils.split ( tableSuffix, "," );
            tableName = replaceEnd ( tableName, searchList );//经过该方法，替换后缀 areaEntity
        }
        return StringUtils.convertToCamelCase ( tableName );
    }

    /**
     * 批量替换前缀
     * @param replacementm 替换值
     * @param searchList   替换列表: _info
     * @return
     */
    public static String replaceFirst (String replacementm, String[] searchList) {
        String text = replacementm;
        for ( String searchString : searchList ) { //erp_area_info
            if ( replacementm.startsWith ( searchString ) ) {
                text = replacementm.replaceFirst ( searchString, "" );
                break;
            }
        }
        return text;
    }

    /**
     * 替换类名中的后缀_info 为 Entity
     * @param replacementm
     * @param searchList
     * @return
     */
    public static String replaceEnd (String replacementm, String[] searchList) {
        String text = replacementm;
        for ( String searchString : searchList ) { //area_info
            if ( replacementm.endsWith ( searchString ) ) {
                text = replacementm.replaceFirst ( searchString, "_entity" );
                break;
            }
        }
        return text;
    }

    /**
     * 关键字替换
     * @param text 需要被替换的名字
     * @return 替换后的名字
     */
    public static String replaceText (String text) {
        return RegExUtils.replaceAll ( text, "(?:表|若依)", "" );
    }

    /**
     * 获取数据库类型字段
     * @param columnType 列类型
     * @return 截取后的列类型
     */
    public static String getDbType (String columnType) {
        if ( StringUtils.indexOf ( columnType, "(" ) > 0 ) {
            return StringUtils.substringBefore ( columnType, "(" );
        } else {
            return columnType;
        }
    }

    /**
     * 获取字段长度
     * @param columnType 列类型
     * @return 截取后的列类型
     */
    public static Integer getColumnLength (String columnType) {
        if ( StringUtils.indexOf ( columnType, "(" ) > 0 ) {
            String length = StringUtils.substringBetween ( columnType, "(", ")" );
            return Integer.valueOf ( length );
        } else {
            return 0;
        }
    }
}
